package com.kurt.util;

import cn.hutool.crypto.digest.DigestUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 密码工具类
 * 用于密码加密和验证
 */
@Slf4j
public class PasswordUtil {


    /**
     * 盐值（用于增强密码安全性）
     */
    private static final String SALT = "server808";

    /**
     * 加密密码
     *
     * @param password 原始密码
     * @return 加密后的密码
     */
    public static String encryptPassword(String password) {
        if (password == null || password.isEmpty()) {
            throw new IllegalArgumentException("密码不能为空");
        }

        try {
            // 使用MD5加密，并添加盐值
            String saltedPassword = password + SALT;
            return DigestUtil.md5Hex(saltedPassword);
        } catch (Exception e) {
            log.error("密码加密失败", e);
            throw new RuntimeException("密码加密失败", e);
        }
    }

    /**
     * 验证密码
     *
     * @param password          原始密码
     * @param encryptedPassword 加密后的密码
     * @return 是否匹配
     */
    public static boolean verifyPassword(String password, String encryptedPassword) {
        if (password == null || password.isEmpty() || encryptedPassword == null || encryptedPassword.isEmpty()) {
            return false;
        }

        try {
            String encrypted = encryptPassword(password);
            return encrypted.equals(encryptedPassword);
        } catch (Exception e) {
            log.error("密码验证失败", e);
            return false;
        }
    }

    /**
     * 生成随机密码
     *
     * @param length 密码长度
     * @return 随机密码
     */
    public static String generateRandomPassword(int length) {
        if (length <= 0) {
            length = 8; // 默认长度
        }

        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder password = new StringBuilder();

        for (int i = 0; i < length; i++) {
            int index = (int) (Math.random() * chars.length());
            password.append(chars.charAt(index));
        }

        return password.toString();
    }

    /**
     * 检查密码强度
     *
     * @param password 密码
     * @return 密码强度等级（1-弱，2-中，3-强）
     */
    public static int checkPasswordStrength(String password) {
        if (password == null || password.isEmpty()) {
            return 0;
        }

        int strength = 0;

        // 长度检查
        if (password.length() >= 8) {
            strength++;
        }

        // 包含小写字母
        if (password.matches(".*[a-z].*")) {
            strength++;
        }

        // 包含大写字母
        if (password.matches(".*[A-Z].*")) {
            strength++;
        }

        // 包含数字
        if (password.matches(".*[0-9].*")) {
            strength++;
        }

        // 包含特殊字符
        if (password.matches(".*[!@#$%^&*(),.?\":{}|<>].*")) {
            strength++;
        }

        return Math.min(strength, 3);
    }
}
